home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Sound Cards
/
Programming Sound Cards.iso
/
sound_26
/
ncounter.asm
< prev
next >
Wrap
Assembly Source File
|
1995-01-01
|
3KB
|
70 lines
code_seg segment
assume cs:code_seg
org 100h
jmp start
;----------------------------------
;B/C Software ;Author
;520 North Stateline Rd
;Sharon, Pa 16146
;----------------------------------
message1 db 'press Esc to Quit',0dh,0ah,'$' ;Esc to end close encounter
message2 db 'press any other key to play$' ;or to go again
;-----------------------------------------------------------------------------
;note + delay count
muzic_notes dw 1521,0015, 1355,0015, 1715,0015, 3416,0015h
dw 2280,0030, 0ffffh ;theme of "close encounter"
;-----------------------------------------------------------------------------
start proc near
mov ah,9 ;DOS function number to print string
mov dx,offset message1 ;the message
int 21h ;DOS interrupt
mov ah,9 ;DOS function number to print string
mov dx,offset message2 ;the message
int 21h ;DOS interrupt
begin: mov ah,0 ;BIOS function wait for key press
int 16h ;BIOS interrupt
cmp ah,1 ;Esc scan code
jz done ;do we stop ?
call play ;no call play
jmp begin ;go see if we do it again
done: mov ax,4c00h ;no exit back to DOS
int 21h ;DOS interrupt
start endp
;-------------------------------------------
play proc near
cli ;interrupts off
lea si,muzic_notes ;point (si) to our note table
play2: cld ;must increment forward
lodsw ;load word into ax and increment (si)
cmp ax,0ffffh ;is it ffff - if so end of table
jz x_muzic2 ;time to quit
push ax ;push our note value on the stack
mov al,10110110xb ;the magic number
out 43h,al ;send it
pop ax ;pop our note value off the stack
out 42h,al ;send LSB first
mov al,ah ;place MSB in al
out 42h,al ;send it next
in al,61h ;get value to turn on speaker
or al,00000011xb ;OR the gotten value
out 61h,al ;now we turn on speaker
lodsw ;load the repeat loop count into (ax)
loop6: mov cx,10000 ;first delay count
loop7: loop loop7 ;do the delay
dec ax ;decrement repeat count
jnz loop6 ;if not = 0 loop back
in al,61h ;all done
and al,11111100xb ;number turns speaker off
out 61h,al ;send it
mov cx,5000 ;second delay count
loop8: loop loop8 ;wait a bit before next note
jmp short play2 ;now go do next note
x_muzic2:
sti ;enable interrupts
ret
play ends
;-------------------------------------------
code_seg ends